#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main()
{
    int fd;
    struct stat file_stat;
    char *mapped_memory;

    //打开文件
    fd = open("test.txt",O_RDWR);
    if(fd == -1){
        perror("open");
        return 1;
    }

    //获取文件信息
    if(fstat(fd,&file_stat) == -1){
        perror("fstat");
        close(fd);
        return 1;
    }

    //建立内存映射
    mapped_memory = (char *)mmap(NULL,file_stat.st_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
    if(mapped_memory == MAP_FAILED){
        perror("mmap");
        close(fd);
        return 1;
    }

    //关闭文件描述符，因为映射建立后不再需要文件描述符
    close(fd);

    //对映射内存进行操作
    printf("原使文件内容:%s\n",mapped_memory);
    //修改文件内容
    mapped_memory[0] = 'H';
    

    //将修改同步到文件
    if(msync(mapped_memory,file_stat.st_size,MS_SYNC) ==-1){
        perror("msync");
    }

    //解除内存映射
    if(munmap(mapped_memory,file_stat.st_size) == -1){
        perror("munmap");
        return 1;
    }
    return 0;
}